R Talk | 旷视科技目标检测概述:Beyond RetinaNet and Mask R-CNN
「R Talk 」是一个深度学习专栏,将通过不定期的推送展示旷视科技的学术分享及阶段性技术成果。「R」是 Research 的缩写,也是旷视研究院的内部代号;而所有的「Talk」都是来自旷视的 Researcher。「R Talk 」旨在通过一场场精彩纷呈的深度学习演讲,抛砖引玉,推陈出新,推动中国乃至全球领域深度学习技术的大发展。
Introduction:什么是目标检测,其技术现状是什么;
Challenges:目前目标检测领域的五个挑战点及旷视分别给出的技术解决方案;
Conclusion:物体检测技术的任务远未完成,the devil is in the detail。
物体检测本质上面认为是在同时做分类跟定位两个任务。在传统方法时代,往往是把两个任务割裂开来,先做定位(枚举所有候选框),然后做分类。从深度学习时代,分类跟定位被耦合在网络中,彼此互相影响。深度神经网络的这几年的发展非常迅速,但是目前的网络设计对于分类跟定位这两个任务很难得到鱼和熊掌兼得,希望物体检测在未来的技术的推动下能有更多的发展,同时解决分类跟定位两个难题。
Introduction
目标检测技术是计算机视觉诸多应用的一个基本组件,(实时地)实现对不同类别物体又快又准的框定,准表现在两个方面,定位准和分类准。通过手持手机拍摄的通用目标检测中,旷视科技 COCO 2017 目标检测冠军算法跑在从 Youtube 下载的一些视频,展现了当前最佳的水平。虽然上图中算法横向比较来讲很不错,包括可以检测出玻璃反光上的人像,但依然有不少的 miss,比如只检测出一堆玉米棒中的一个。
又比如汽车驾驶场景下的目标检测,鼠标所指的小物体(汽车)并不是可以一直检到,时有时无;甚至还会出现一些错误的检测结果。可见,目前的目标检测技术确实做了不少的东西,出了很多的成果,但是细节上还是存在很多有待完善的问题。目标检测算法成为了人工智能公司的大多数研发产品的标配,包括旷视科技,很多产品在很大程度上取决于检测到多少物体。如果往更远处看,目标检测技术将会进一步应用到自动驾驶和医疗图像诊断之中。
▊现代目标检测
传统的目标检测技术在接受深度学习洗礼之前多是基于 sliding window 来做的,遍历一张图片上的所有 window,据其提取 hand-crafted 特征,其 pipeline 主要是“特征+分类器”;两者最大的一个区别是基于深度学习的现代目标检测技术特征是基于深度神经网络,传统的目标检测技术需要手动设计特征,比如 Haar、HOG、LBP、ACF 等;后面再加上一个分类器,分类器主要有 SVM、Boosting 和随机森林。
深度学习出来之后,改变了整套框架。现代目标检测技术的 pipeline 为输入(图像)-> Backone(主干网络) -> Head(出口) -> NMS(后处理),可以说目前所有的深度学习检测器都是基于这套框架来做的;RetinaNet 和 Mask R-CNN 是 2017 年出现的两个非常有代表性的成果, 两者分别是 one-stage 和 two-stage 的,共同奠定了目标检测框架的基调。
在 RetinaNet 中,第 1-5 层的特征作为 backbone,第 3-7 层分别接 4 个卷积作为 head;Mask R-CNN 本质上等价于 FPN+ ROIAlign,其第 1-5 层的特征作为 backbone,并在 3-6 层的 head 上接 2 个全连接层作为输出。 one-stage 和 two-stage 检测器之间的本质区别在于检出率(recall)与定位(localization)之间的权衡(tradeoff)。Recall 是指如果一张图像上有 100 个物体,检测到 99 个,那么 recall 为 99%;Localization 则是指边界框框住物体的空间上的精度。
一般来讲,one-stage 检测器的 recall 较高,但是 localization 会有所折衷;相反, two-stage 检测器的定位能力则较强,但是 recall 较低,主要原因是第二个 stage 可以 refine 框的精度,但是也会误杀一些正样本。但是大家普遍会觉得 one-stage 检测器往往更快,比如 YOLO、SSD; two-stage 检测器往往更准,比如 Faster R-CNN、FPN,但这个事情事实上并不成立,后文会有详述。
▊RetinaNet
RetinaNet 出自 ICCV 2017 最佳学术论文《Focal Loss for Dense Object Detection》,本质上它与 Mask R-CNN 非常相似。RetinaNet 结构上主要基于 FPN,只是在输出上做了一个非常重要的操作——Focal Loss,本质上是一个 online hard negative data mining 的过程。RetinaNet 最大的一个亮点是在相同速度下性能优于之前大多数算法;在相同性能下速度快于之前大多数算法,兼得速度与精度,彻底改变了大家从前关于 one-stage 快、two-stage 准的固有想法。
参考链接:
《Focal Loss for Dense Object Detection》:
https://arxiv.org/abs/1708.02002
▊Mask R-CNN
2017 年何恺明组又做了另外一个工作,叫作 Mask R-CNN,获得了 ICCV 2017 最佳论文奖。如果拆分开来,Mask R-CNN 的结构也非常简单,本质上是 FPN+ROIAlign,后者解决的是 ROIPool 的对齐问题,它对于检测可能意义不大,但是对于分割却意义重大。
由上图可知,加上 ROIAlign 可以带来 1+ 的涨点,达到 37.3,再加上 Mask 监督信号则涨点更多,换上更大的 backbone (ResNeXt) 最高可达到 39.8。可以说这篇文章的最大贡献是 ROIPool 变换成 ROIAlign 从而解决了对齐的问题。微软亚洲研究院资深研究员代季峰曾做过类似工作——Deformable Pool,它本质上等于 ROIAlign+Offset,所以逻辑上来讲 Deformable Pool 也有对齐的作用。
通过上述分析可以看到,物体检测技术发展到目前 pipeline 似乎已经趋近成熟,进入瓶颈期,但是在当前钱最优的技术水平与实际的产品级别的实战要求之间依然存在巨大的鸿沟,尤其是通用物体检测。如何去填补这一差距呢?
参考链接:
《Mask R-CNN》:https://arxiv.org/abs/1703.06870
Challenges
我们认为,the devil is in the detail,本文将从五个细节点着手去填补这一差距!通过从这些细节点出发,不断优化这项技术,才能推动其走向产品化,更实用、更落地。
从 challenges 的角度讲,我们再次回到现代目标检测的基本框架——输入(图像)-> Backone(主干网络) -> Head(出口) -> NMS(后处理),这其中暴漏了五个潜在的难题:
Backbone,目前主要使用的是 ImageNet Pretrained models,比如 VGG-16、ResNet、DenseNet 等;
Head,传统的 two-stage 网络慢的主要原因在于 head 太厚,可以对其进行加速,变得更薄、更快;
Scale,比如图像中人像的尺寸变化很大,大到 2k x 2k,小到 10 x 10,如何使神经网络算法更好地处理物体尺寸的变化是一个非常有趣的话题;
Batch Size,传统目标检测器的 batch size 非常小,为什么不尝试使用更大的 batch size 呢?
Crowd,无论是传统还是现代目标检测器,都会使用到一个叫做 NMS 后处理步骤,但是目前现有的 Benchmark 对 NMS 的优化并不敏感。
以上五个点相当于抛砖引玉,虽然 RetinaNet 和 Mask R-CNN 出来之后成绩很好,但是一些细节之处依然有待提升,旷视分别就这五个点给出了自己的尝试。
▊Backbone
第一个细节点是 Backbone。
很多主干网络基于 ImageNet 预训练,从而是针对分类任务进行设计的。分类网络训练到最后会丢弃所有的空间分辨率信息,再做一个输出;它只需要把全局信息、context 以及更大的感受野组合在一起,得到一个图像分类层面的信息。
但是这对于检测、分割和人体关键点等需要精确定位每个像素的计算机视觉任务来讲并不友好。因为对检测任务来讲,不仅需要感受野的信息,还需要空间分辨率的信息。这是之前用 ImageNet 预训练模型做检测的一个非常大的误区。
另外一个误区是包括 RetinaNet 和 Mask R-CNN 这两个工作在内,其第 1-5 层是预训练的,但是第 6 层 (或者有些算法的第 7 层)则是随机初始化的,这不一定很科学,所以如何把 f6、f7 放进 ImageNet 进行预训练是一个很有意思的话题。
DetNet 是旷视专门针对目标检测打造的 backbone 网络,代码稍后会开源。DetNet 虽然也是针对分类问题进行训练,但会考虑到定位问题的需求;另外就是在 ImageNet 预训练 P6 层,使得初始化权重更为科学。
相较于 FPN 和分类网络 backbone,DetNet backbone 的改动相对简单,但是效果非常明显,即在后面几层不做下采样,而是增加 dilation,从而保留了一定空间分辨率的特征图;同时也不能做太过,比如 8x,否则计算量会非常大。另外,还会把 P6 加进去一直训练。
参考链接:
《DetNet: A Backbone network for Object Detection》:https://arxiv.org/abs/1804.06215
这是 DetNet 的框架。上图略掉了前 3 层,从第 4 层的输入开始,每层之后会做一个 16x 的下采样;做 ImageNet 预训练时会接一个 14x14 GAP 和一个 FC-1000,训练完之后再把这两部分去掉。可以看出 DetNet 结构上来讲和 FPN 一模一样,只不过是把 ResNet-50 替换为 DetNet,想法直观而简单。
DetNet(D)和 ResNet (R) 的结果对比,自左向右依次是 ImageNet、COCO minival 和 COCO test-dev 上的竞赛结果。可以看出分类结果上 D-59(23.5)比 R-50(24.1)要优,当然这可能是由于计算量大的原因,因此我们又设计了计算量相当的 R-62,D-59 在结果上依然略优;但是在 COCO minival 和 COCO test-dev 检测结果上,D-59 要比 R-62 和 R-50 高出很多。
这里要说明的一点是,我们自己复现的 baseline 要普遍高于论文上的 baseline。在 D-101 和 R-101 的对比中,结果也是一致的。
接着,对 DetNet 的涨点做一些更细致的拆分,主要表现为,对于大物体来讲,DetNet 增加了网络的定位能力,比如从 AP_85 从 34.5 涨点至 40.0;对于小物体来讲,则增加了其 recall 能力,比如 AP_50 从 60.0 涨点至 66.4。
这里是 DetNet 作为 backbone 与当前最佳模型的对比结果,上图中的上半部分表示检测的对比结果,下半部分是分割的对比结果;可以看出以 DetNet-59 作为 backbone 的模型 FPN 和 Mask R-CNN 在 mAP 等多项指标上涨点还是很明显的,虽然其中有复现 baseline 的原因,但还是无法掩盖涨点的事实。你会发现,只是简单改变 backbone 的结构,就带来很大的涨点,所以 DetNet 的工作意义非常大。最后总结一下:
backbone 作为神经网络的重要模块之一,提供了基础的特征表示,但是非常耗费计算量,通过实验我们发现,对于一些 single-stage 网络,backbone 的计算量占比最高可达 90%;
backone 通常是针对分类任务而设计的,对于检测任务并不友好,DetNet 最有价值的一点在于提出一种新思路,在设计 base model 时更加注重其泛化能力,使其适用于检测、分割或者人体关键点等不同任务,而不仅仅局限于分类任务,DetNet 希望做一种抛砖引玉的工作;
DetNet 是第一个针对检测任务而设计的骨干网络,并朝着兼得感受野和空间分辨率的方向而努力。
▊Head
第二个细节点是 Head。
Head 是一个神经网络的“头部”。two-stage 检测器长久以来面临的一个问题是速度的提升,从 R-CNN 到 Fast R-CNN 到 Faster R-CNN 再到 R-FCN,本质上就做一件事情——加速。
从框架的角度讲,RCNN 的速度非常慢,慢到让人无法想象,检测一张图需要很多秒,从产品角度讲这是不可思议的;迭代到 R-FCN 时,1 秒钟最多可以检测 5 张图,这和 one-stage 检测器 YOLO 和 SSD 相比依然没有竞争力。那么,如何设计一个 two-stage 检测器,使其既有 YOLO 这样的速度,同时又保证性能?
我们可以从网络两个最核心的东西(backbone 和 head)着手,把 backbone 变的更小、更合理;把 head 变轻,则是旷视的另一项成果—— Light Head RCNN 的工作。
Light Head RCNN 的代码已开源。常见的 two-stage 方法有两个: Faster R-CNN 和 R-FCN,Light Head RCNN 实际上是这两种方法的一个结合体。由于 proposal 不可复用,当其不断增多时,Faster R-CNN 网络的计算量会陡增;R-FCN 正是为此而生,它解决了复用的问题,但是空间分辨率却丢失很多,因此通过增加大量的通道(channel)弥补这一损失,导致通道过多(4000+ 维),特征图层很厚。
Light Head RCNN 所做工作就是去除这些过多的通道,发现对速度影响很明显,对结果几乎没有影响,不掉点;前面会接一个 large separable convolution,它起到类似于 large kernel 的作用,可以缩小特征图层。
另外一个和 R-FCN 的区别是,Light Head RCNN 的 head 部分是一个全连接层(连接到 PS ROI pool/Align),这非常本质,影响非常大。因此,Light Head RCNN 本质的改进主要有两点:一是 head 可以做到非常薄;二是很多计算量可复用,从而大大提高了速度。
参考链接:
《Light-Head R-CNN: In Defense of Two-Stage Object Detector》:https://arxiv.org/abs/1711.07264
代码:https://github.com/zengarden/light_head_rcnn
这里是 Light Head RCNN 的一些结果。有两个 baseline:Faster R-CNN 和 R-FCN。可以发现,如果加 Large Kernel,mAP 则涨点至 35.9;再加上 Light Head R-CNN,则又涨点至 37.7,效果很明显;这只是裸涨,如果再加上 PS ROI Align,更改 NMS 阈值,大概还可以再涨两个点。如果对比上述的两个优秀工作 RetinaNet 和 Mask-R-CNN,可以看到涨点依然非常明显。以上是从大模型的角度讲,性能要好于市面上的其他同等模型。
我们想强调的一点是,即使从小模型的角度讲,速度的提升依然非常亮眼。这主要是因为通过把 head 做薄而大大加快了网络的速度。Light Head RCNN 以 Xception-145 (145 表示 145 M FLOPs)作为 backbone,速度可以实现很大的提升,同时性能保持在较高水平。
通过与市面上主流的小模型相对比,同等速度下比性能,同等性能下比速度,Light Head RCNN 都是领先的。当然由于设备、硬件平台不一样,其中可能会有一些不公平,但是不会造成本质的差别。
参考链接:
《Xception: Deep Learning with Depthwise Separable Convolutions》:https://arxiv.org/abs/1610.02357
同时,Light Head RCNN 手机版的工作也在进行之中,提前预告一下。这可能是第一个把 two-stage 检测器在手机上运行起来,同时性能又比较合理有意义的一个算法。
总结一下,Light Head RCNN 的初衷是做加速,并在性能和速度之间实现了一个很好的权衡,具体细节做法通过使用 Large Kernel 和更小更薄的特征图,把全连接层接在 ROI pool 之后。最后要强调的一点是 Light Head RCNN 还可以做成手机端的。
▊Scale
第三个细节点是 Scale。
在很多的目标检测场景之下,Scale 的变化会非常大,一张图像上经常会出现不同 scale 的物体。基于 Anchor 的做法问题在于预设性,预设尺寸之内的物体检测做的比较好,之外的则不能很好地处理。
先前的工作比如 SSD 和 FPN 等是一类方法,采取分而治之的策略,缺点是 scale variation 比较受限;CVPR 2018 有篇 oral 论文 SNIP(Scale Normalization for Image Pyramids),它代表了另一类工作,但是最大的问题在于推断速度较慢。
那么如何在尺寸变化与推断速度之间实现一个很好的权衡呢?
参考链接:
An Analysis of Scale Invariance in Object Detection - SNIP:https://arxiv.org/abs/1711.08189
SFace 是旷视最近的一个工作,本质上是做人脸检测。目前的很多方法是基于 Anchor 的,好处是可以对 anchor 覆盖的尺度进行较好的定位,坏处是难以定位所有尺度的人脸。同时还有很多方法不使用 anchor,比如 DenseBox,优点是可以覆盖不同尺度的人脸,缺点是定位能力较差。所以 SFace 的想法也很简单,就是吸收整合了上述两种方法的长处。
参考链接:
《SFace: An Efficient Network for Face Detection in Large Scale Variations》:https://arxiv.org/abs/1804.06559
SFace 采用 FPN 结构,backbone 是 Xception-39(39 表示 39 M FLOPs),然后 head 有两个分支,一个是 anchor-based,另一个是 anchor-free。实验发现这两个分支的评分(score)不是很一致,不在同一个范围之内,因此加入 IOU 进行 rescore,保证最后得到的 scale 差别不大。
这里是 SFace 的一些结果。图的上半部分是 WiderFace 数据集上 SFace 与一些当前最优模型的对比,可以看出还是非常有优势的,特别是下半部分,在不同输入大小的情况下,SFace 保证了一定的精度,同时速度又非常快。在不增加速度 overhead 的情况下,同时又把 scale 这个问题解好,这一工作还是非常有价值的。
总结一下,SFace 的主要工作即是通过整合 anchor-based 和 anchor-free 两种方法来解决 scale 问题;其次,在这项工作中还引入了一个叫做 4K Face 的数据集,专门用来解决人脸检测中尺寸的变化问题。
▊Batch Size
第四个细节点是 Batch Size。
在一般的目标检测框架中,batch size 往往很小,比如 R-CNN 和 Faster RCNN 的为 2;在一些最新的工作比如 RetinaNet 和 Mask RCNN 中,batch size 也仅为 16;相比之下,在 ImageNet 中分类模型的 batch size 一般设为 256。可以看到两者的 gap 非常大。
我们因此假设,把目标检测的 batch size 调大会有什么效果呢?或者反过来讲,batch size 很小存在哪些问题?主要有三个潜在的问题。一是训练时间较长,二是 BN 统计不准确,三是正负样本比例失衡。之前也有工作试图解决这些问题,即 Facebook 的《Group Normalization》,它本质上是在通道上做一些归一化的操作。
参考链接:
《Group Normalization》:
https://arxiv.org/abs/1803.08494
同样针对这些问题,旷视有一项新工作叫 MegDet。下面直接介绍一下结果,更多细节请见论文。上图中横轴为训练时间轴,纵轴为 COCO 结果。假设把 batch size 调到 256,它会很早收敛,如果 batch size 是 16,则收敛时间非常长。同时最有意义的一点是收敛点的精度更好。这是 batch size 大的一个潜在好处。
参考链接:
《MegDet: A Large Mini-Batch Object Detector》:https://arxiv.org/abs/1711.07240
MegDet 的实现并不难,主要是学习率 warmup 策略和跨卡批归一化(CGBN)的工程实现。旷视据此拿下了 COCO 2017 物体检测的冠军,这是目前市面上可以找到的最高结果。开头的实例视频就是拿 MegDet 跑的,虽然这个结果已经非常之高,但实际上仍然存在很多可做优化的潜在问题。
▊Crowd
第五个细节点是 Crowd。
目标检测领域中我们一直想做,做的不多并且一直不 solid 的一个场景就是 crowd。目前,无论是传统或者现代物体检测技术,都有一个 NMS(Non Maximum Suppression) 操作来去除多余的候选框,它作为一个后处理步骤加在算法的最后。一般来讲,NMS 在通用物体检测数据集比如 COCO 和 VOC 上是没问题的,这些数据集本质上并不 crowd。
真实场景中 crowd 情况非常多,但是由于缺乏相应的数据集,导致这一问题并没有在学术圈重视起来。为解决这一问题,旷视引入了一个新数据集——CrowdHuman,希望学术界引起对这件事情的重视,希望大家一起协力优化这一方向,希望共同努力在 crowd 场景下把目标检测做的更好、更科学。
这一方向上已有两个相关工作在尝试。ICCV 2017 有一个叫做 Soft-NMS 的工作,通过一行代码改进 NMS;微软研究院资深研究员代季峰有一个 CVPR 2018 的工作——Relation Networks,尝试用端到端方式去学习 NMS,逻辑上讲还是非常科学的。但是上述两个工作并没有涉及最本质的问题——benchmark,从而缺乏了一个科学的衡量标准。
参考链接:
《Soft-NMS -- Improving Object Detection With One Line of Code》:https://arxiv.org/abs/1704.04503
《Relation Networks for Object Detection》:https://arxiv.org/abs/1711.11575
因此,旷视推出了 CrowdHuman,并已开源。这个 benchmark 的特点是主要做行人检测,一方面,数据标注涵盖头部位置,人体的可见框和完整框,并且人框与头框之间有绑定关系;另一方面,通过实验我们发现该数据集有一定的泛化能力,经过 CrowdHuman 预训练之后,在人体头部/行人等其他数据集上都有一定程度的涨点。最重要的一点是,这个数据集非常 Crowd!
参考链接:
《CrowdHuman: A Benchmark for Detecting Human in a Crowd》:https://arxiv.org/abs/1805.00123
网址:http://www.crowdhuman.org
这里给出了有关 crowdness 的一些验证。虽然 CrowdHuman 图像数量不算多,只有 15000 张,但是在其他指标上优势异常明显,比如平均每张图像上的人数(person/image)达到 22.64。另外我们做了两人的二阶 overlap 和三人的高阶 overlap 对比,发现 CrowdHuman 要比 Caltech、CityPerson 和 COCO 数据集更为 crowd。以下是该数据集的一些样图:
可以看出有完整的头框和人体可见框和人体完整框的标注,带有对角线的黄色框表示被忽略的区域。
该数据集有着很强的泛化能力。由上图可知,先通过 CrowdHuman 进行训练,再放在 CityPerson、Caltech、Brainwash 和 COCOPersons 数据集上再训练(refine),结果全部获得了相应提升或者实现了当前最佳。
同样基于该数据集,旷视测试了自己的一个内部算法,可以看出行人检测的处理效果非常好。注意,这是检测模型的输出结果而不是标注的框,可以看出很多框的 overlap 会被传统 NMS 去掉。一些样图如下所示:
总结一下,在 crowd 场景之下做检测是一项非常有挑战、有实际需求的工作, CrowdHuman 数据集正是为此而生。它有一些主要的特性,比如非常 crowd,有头部框、可见人体框和完整人体框的标注,以及针对其他基准的较强泛化能力,比如 Caltech、CityPerson 和 COCO。
Conclusion
最后简单做一个总结,主要有三点:
首先想要说明的一点是目标检测技术面临的问题远远没有解决,还有很多细节点可以优化。
一些细节点对提升目标检测的性能至关重要,旷视目前的工作主要从 backbone、head、scale、batch size 和 crowd 等方面着手。
目标检测的进步将会极大地推动计算机视觉产业的发展。
Talk 的梳理过程就是一次再反思,把这些话补在 Talk 之后也许是一次值得的尝试。这段时间“AI 寒冬论”不绝于耳,其中最漂亮的一次反击要算 Tom Mitchell,他认为现在的 AI 与之前大不同,已经广泛而牢固地深深扎根于产业之中,一棵树容易被冲倒,一片森林却坚不可催。我认为,AI 的这种情况同样适用于目标检测,在经历了由“手动”向“自动”的范式转换之后,目标检测已经步入“春天”,大步向“盛夏”奔去;至于机器之眼能不能成为“上帝之眼”则是仰望星空的问题,本文负责脚踏实地,而前者的实现恐怕需要另一场等同于深度学习量级的变革。
本期 Talker
俞刚博士现为旷视科技 Research Leader、Detection 组负责人,2014年毕业于新加坡南洋理工大学。博士毕业后在南洋理工大学从事 research fellow 的研发工作。2014年底加入旷视科技公司。其主要研究方向主要集中在计算机视觉以及机器学习方面,包括行人动作行为分析,行人姿态估计,物体检测以及语义分割。自2010年以来,已经在顶级会议如 CVPR, AAAI, ECCV 以及顶级期刊如 IEEE Transaction on Image Processing, IEEE Transaction on Multimedia 等上面发表学术论文十多篇。同时著有书籍一本。俞刚博士带队参加 2017 年图像识别国际大赛 COCO 获得检测第一名,人体姿态估计第一名。
We are Looking for
Researchers / RSDEs / Interns
yugang@megvii.comR Talk 视频回放
Power Human with AI.
长按二维码关注旷视科技
让 机 器 看 懂 世 界
全球领先的图像识别服务
www.megvii.com
✆ 400-6700-866